package com.lile.integer;

/*
 * 需求1：我给出了一个数据，我要判断这个数据是不是在int范围呢?肿么办呢?
 * 需求2：我给出一个数据100，我要得到它的二进制，八进制，十六进制? 三进制，五进制，七进制???
 * 那么，有没有比较简单的方式让我们来实现这样的需求呢?有。
 * 而基本类型是做不到的，因为基本类型没有功能可以使用。所以，这种的操作最好是能有功能实现。
 * 然后我们调用功能即可。
 * 为了简化我们针对基本类型数据的更复杂的操作，java就针对每种基本类型提供了一个包装类类型，基本类型包装类。
 * byte		Byte
 * short	Short
 * int		Integer
 * long		Long
 * float	Float
 * double	Double
 * char		Character
 * boolean	Boolean
 */
public class IntegerDemo {

	public static void main(String[] args) {
		// constructorMethod();
		// intStringConvert();
		// hexadecimalConversion();
		// autoPackOpenPack();
		rangeOfBytesBufferPool();
	}

	/*
	 * Integer的构造方法： Integer(int value)： 把int类型的值包装成Integer类型 Integer(String s):
	 * 把数字类型的字符串转换成Integer类型
	 */
	public static void constructorMethod() {
		int number = 100;
		Integer integer = new Integer(number);
		System.out.println("integer:" + integer);

		String string = "100";
		Integer stringInteger = new Integer(string);
		System.out.println("stringInteger:" + stringInteger);
	}

	/*
	 * int和String类型的相互转换即可。
	 * 
	 * int -- String String.valueOf(number) Integer.toString(number)
	 * 
	 * String -- int Integer.parseInt(s);
	 */
	public static void intStringConvert() {
		// int -- String
		int number = 100;
		// 方法1
		String s1 = number + "";
		// 方式2
		String s2 = String.valueOf(number);
		// 方式3
		// int -- Integer -- String
		Integer i = new Integer(number);
		String s3 = i.toString();
		// 方式4
		String s4 = Integer.toString(number);
		System.out.println("--------------");

		String s = "100";
		// 方式1
		// String -- Integer -- int
		Integer ii = new Integer(s);
		// public int intValue()
		int num = ii.intValue();
		// 方式2
		// public static int parseInt(String s)
		int num2 = Integer.parseInt(s);
	}

	/*
	 * 常用的基本进制转换 public static String toBinaryString(int i) public static String
	 * toOctalString(int i) public static String toHexString(int i) 十进制到其他进制
	 * public static String toString(int i,int radix) 其他进制到十进制 public static int
	 * parseInt(String s,int radix)
	 */
	public static void hexadecimalConversion() {
		// public static String toBinaryString(int i)
		System.out.println(Integer.toBinaryString(100));
		// public static String toOctalString(int i)
		System.out.println(Integer.toOctalString(100));
		// public static String toHexString(int i)
		System.out.println(Integer.toHexString(100));

		// public static String toString(int i,int radix):
		// 通过简单的测试，我们知道了进制的范围是2-36
		System.out.println(Integer.toString(100, 2));
		System.out.println(Integer.toString(100, 8));
		System.out.println(Integer.toString(100, 16));
		System.out.println(Integer.toString(100, 1));
		System.out.println(Integer.toString(100, 100));
		System.out.println(Integer.toString(100, 50));
		System.out.println(Integer.toString(100, 25));
		System.out.println(Integer.toString(100, 37));
		System.out.println(Integer.toString(100, 32));
		System.out.println(Integer.toString(100, 35));
		System.out.println(Integer.toString(100, 36));
		System.out.println(Integer.toString(100, 7));
		System.out.println("----------------------");

		// 其他进制到十进制
		// public static int parseInt(String s,int radix)
		System.out.println(Integer.parseInt("100", 2));
		System.out.println(Integer.parseInt("100", 8));
		System.out.println(Integer.parseInt("100", 16));
		System.out.println(Integer.parseInt("300", 12));
	}

	/*
	 * JDK5的新特性： 自动装箱:int -- Integer 底层方法：public static Integer valueOf(int i)
	 * 自动拆箱：Integer -- int 底层方法：public int intValue()
	 * 
	 * 注意：对象不能为null。 开发原则：只要是对象，做操作，肯定先判断对象是否为null，如果不为null，才继续操作。
	 */
	public static void autoPackOpenPack() {
		// Integer i = new Integer(100);
		Integer i = 100; // 自动装箱
		// Integer i = Integer.valueOf(100);

		i += 200; // i = i + 200
		// i = Integer.valueOf(i.intValue() + 200);

		System.out.println(i);
	}

	// 看程序写结果:byte范围的缓存池
	public static void rangeOfBytesBufferPool() {
		Integer i1 = new Integer(127);
		Integer i2 = new Integer(127);
		System.out.println(i1 == i2);// false
		System.out.println(i1.equals(i2));// true

		Integer i3 = new Integer(128);
		Integer i4 = new Integer(128);
		System.out.println(i3 == i4);// false
		System.out.println(i3.equals(i4));// true

		Integer i5 = 127;
		Integer i6 = 127;
		System.out.println(i5 == i6);// true
		System.out.println(i5.equals(i6));// true

		Integer i7 = 128;
		Integer i8 = 128;
		System.out.println(i7 == i8);// false
		System.out.println(i7.equals(i8));// true

		// 要想知道为什么，就必须看源码。
		// public static Integer valueOf(int i)
		// char ch = 127;
		// Integer i = Integer.valueOf(ch);
		// 通过查看源码我们知道如果数据在-128到127之间，是从一个缓存数组中返回的。
		// 如果不在这个范围内，就是重新创建的new出来的对象。
	}
}
